'use strict';

const Controller = require('egg').Controller;
/**
 * @controller apiGiftController 微信支付
 */
class GiftController extends Controller {
    /**  
     * @summary 微信支付
     * @description 微信支付
     * @router post /api/gift/wxpay 
     * * @request price string *price 充值金额
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async wxpay() {
        // 结构数据
        let {
            ctx,
            app
        } = this
        let user_id=ctx.authUser.id
        // 参数验证
        ctx.validate({
            price: {
                type: 'int',
                require: true,
                desc: '充值金额'
            }
        })
        // 获取参数
        let {
            price
        } = ctx.request.body
        // 判断充值金额
        if (price <= 0) {
            return ctx.pageFail('至少充值1元')
        }
        // 创建订单
        let no=ctx.randomString(20)
        let order = await app.model.Order.create({
            no,
            price:price*100,
            user_id
        })
        // 判断创建是否成功
        if(!order){
            return ctx.apiFail('订单创建失败')
        }
        // 调取微信支付
        // 支付
        const result = await app.tenpay.getAppParams({
            out_trade_no:no,
            body:"余额充值",
            total_fee: price * 100,
            trade_type:"APP"
        });
        // 返回结果
        ctx.apiSuccess(result);

    }

    /**  
     * @summary 支付回调
     * @description 查看指定直播间
     * @router post /api/gift/notify 
     * * @request id string *id 直播间id
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async notify() {
        // 结构
        let {ctx,app,service}=this
        // 获取信息
        let info=ctx.request.weixin
        if(!info||info.result_code!=='SUCCESS'){
            ctx.reply('支付失败')
        }
        // 通过获取的回调信息查询订单号
        let order=await app.model.Order.findOne({
            where:{
                no:info_out_trade_no
            }
        })
        // 判断订单是否存在
        if(!order){
            ctx.reply('订单不存在')
        }
        // 更改订单号状态
        order.status='success'
        order.save()
        // 修改用户金额
        let user=await service.user.exist(order.user_id)
        // 返回空
        if(user){
            user.coin+=parseInt(info.total_fee)/100
            user.save()
        }
        ctx.reply()
    }

     /**  
     * @summary 获取礼物列表
     * @description 获取礼物列表
     * @router post /api/gift/list 
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async list() {
        // 结构
        let {ctx,app}=this
        ctx.apiSuccess(await app.model.Gift.findAll())
    }
}

module.exports = GiftController;